package Server.provider;

import Server.server.ratelimit.provider.RateLimitProvider;
import Server.serviceRegister.ServiceRegister;
import Server.serviceRegister.impl.ZKServiceRegister;
import lombok.Getter;

import java.net.InetSocketAddress;
import java.util.HashMap;

/* 本地服务存放器 */
public class ServiceProvider {

    // 本地服务存放容器，接口全限定名（String类型）对应服务对象（Object类型）
    // key：接口名，value：服务对象
    private HashMap<String, Object> interfaceProvider;
    private String host;
    private int port;
    // 服务注册类
    private ServiceRegister serviceRegister;
    // 限流器
    @Getter
    private RateLimitProvider rateLimitProvider;

    // 构造方法
    public ServiceProvider(String host, int port) {
        this.interfaceProvider = new HashMap<>();
        this.host = host;
        this.port = port;
        this.serviceRegister = new ZKServiceRegister();
        this.rateLimitProvider = new RateLimitProvider();
    }

    // 本地注册服务
    public void provideServiceInterface(Object service, boolean canRetry) {
        // 接受1个服务实例的完整类名
        String serviceName = service.getClass().getName();
        // 接受服务对象实现的所有接口
        Class<?>[] interfacesName = service.getClass().getInterfaces();
        for (Class<?> i : interfacesName) {
            // 循环遍历所有接口，将接口名作为key，服务对象作为value，放入容器中
            interfaceProvider.put(i.getName(), service);
            // 在注册中心注册服务
            serviceRegister.register(i.getName(), new InetSocketAddress(host, port), canRetry);
        }
    }

    // 根据接口名获取服务对象
    public Object getService(String interfaceName) {
        Object service = interfaceProvider.get(interfaceName);
        if (service == null) {
            throw new RuntimeException("没有找到对应的服务");
        }
        return service;
    }

    public RateLimitProvider getRateLimitProvider(){
        return rateLimitProvider;
    }
}
